#include <stdio.h>
#include <string.h>


/*
    字符串的结束标志为'\0'
    如果字符串的长度为9,那么它所占的空间为10个字节，因为字符串的结束的标志也会占用一个字节的空间

*/

/*
    sizeof的原理，sizeof是利用0地址进行实现的,将传入的数据作为一个数据类型，强制转换0地址为此类型，然后将1就得到传入的数据类型的长度
*/

/*
    typeof(i) 就是获取i的类型
*/

#define SIZEOF(T) ((size_t)((typeof(T)*)0 + 1))


// 宏函数的定义
#define SWAP(a, b) \
    {typeof(a) __temp = 0; \
    __temp = (a); \
    (a) = (b); \
    (b) = __temp;}



int str_len(char *str)
{
    int len = 0;
    while(*str != '\0')
    {
        len++;
        str++;
    }

    return len;
}


int func()
{
    return 1;
}

int main(int argc, char *argv[])
{
    {
        union big_endian
        {
            char a;
            int b;
        }big_endian;

        printf("这个共用体的大小是: %d \n",(int)SIZEOF(big_endian));

        int grade[] = {1,2,3,4,5,6};

        printf("该数组的大小为: %d \n",(int)SIZEOF(grade));
        
    }

    char str[] = "HelloWorld!"; // 11个字符 ，但是有一个字符串结束标志'0'

    printf(" “HelloWorld!” 的长度为: %d 所占的空间为: %d \n",str_len(str),(int)SIZEOF(str));
    printf(" “HelloWorld!” 的长度为: %d 所占的空间为: %d \n",(int)strlen(str),(int)SIZEOF(str));

    

    typeof(func()) hu;

    hu = 1;
    printf("hu: %d hu大小: %d \n",hu,(int)sizeof(hu));

    {
        int a = 3;
        int b = 5;
        
        printf("a = %d b = %d \n",a,b);

        SWAP(a,b);

        printf("a = %d b = %d \n",a,b);

    }

    return 0;
}